#ifndef INPUT_HPP
# define INPUT_HPP

# include "Window.hpp"

namespace gdl
{
  ////////////////////////////////////////////////////////////
  /// Forward declaration of InputImpl.
  ////////////////////////////////////////////////////////////
  class	InputImpl;

  namespace Keys
  {
    ////////////////////////////////////////////////////////////
    /// Enum of keys.
    ////////////////////////////////////////////////////////////
    enum	Key
      {
	A, B, C, D, E, F, G, H, I, J, K, L, M,
	N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
	Num0, Num1, Num2, Num3, Num4,
	Num5, Num6, Num7, Num8, Num9,
	Escape, LControl, LShift, LAlt, LSystem,
	RControl, RShift, RAlt, RSystem, Menu,
	LBracket, RBracket, SemiColon, Comma,
	Period, Quote, Slash, BackSlash, Tilde,
	Equal, Dash, Space, Return, Back, Tab,
	PageUp, PageDown, End, Home, Insert,
	Delete, Add, Subtract, Multiply,
	Divide, Left, Right, Up, Down,
	Numpad0, Numpad1, Numpad2, Numpad3, Numpad4,
	Numpad5, Numpad6, Numpad7, Numpad8, Numpad9,
	F1, F2, F3, F4, F5, F6, F7, F8, F9,
	F10, F11, F12, F13, F14, F15,
	Pause, Count
      };
  }

  namespace	Mouse
  {
    ////////////////////////////////////////////////////////////
    /// Enum of mouse's buttons
    ////////////////////////////////////////////////////////////
    enum	Button
      {
	Left, Right, Middle
      };
  }

  ////////////////////////////////////////////////////////////
  /// The Input class catches each input event for a window.
  ////////////////////////////////////////////////////////////
  class		Input
  {
  public:
    ////////////////////////////////////////////////////////////
    /// Constructor.
    ///
    /// \param[in] window Window to link with.
    ////////////////////////////////////////////////////////////
    Input(gdl::Window & window);

    ////////////////////////////////////////////////////////////
    /// Default destructor.
    ////////////////////////////////////////////////////////////
    ~Input();

    ////////////////////////////////////////////////////////////
    /// Check if a key is down.
    ///
    /// \param[in] key Key to check.
    /// \return If the key is down, true is returned.
    /// Otherwise, returned false.
    ////////////////////////////////////////////////////////////
    bool		isKeyDown(gdl::Keys::Key key);
    ////////////////////////////////////////////////////////////
    /// Check if a mouse button is down.
    ///
    /// \param[in] button Button to check.
    /// \return If the button is down, true is returned.
    /// Otherwise, returned false.
    ////////////////////////////////////////////////////////////
    bool		isMouseButtonDown(gdl::Mouse::Button button);
    ////////////////////////////////////////////////////////////
    /// Get the cursor position.
    ///
    /// \return The cursor position on x-axis.
    ////////////////////////////////////////////////////////////
    int			getMousePositionX(void) const;
    ////////////////////////////////////////////////////////////
    /// Get the cursor position.
    ///
    /// \return The cursor position on y-axis.
    ////////////////////////////////////////////////////////////
    int			getMousePositionY(void) const;
  private:

    ////////////////////////////////////////////////////////////
    /// Link this class with the window's inputs.
    /// Is called in the constructor.
    ////////////////////////////////////////////////////////////
    void		getInput(void);

    ////////////////////////////////////////////////////////////
    /// Input implementation.
    ////////////////////////////////////////////////////////////
    InputImpl&		input_;
  };
}

#endif
